Snowflakeでリーダーアカウントを作成して挙動を確かめてみた

Snowflakeでリーダーアカウントを作成して挙動を確かめてみた

Clock Icon2024.10.21

さがらです。

Snowflakeでは「リーダーアカウント」というアカウントを用いることで、Snowflakeアカウントを持っていないユーザーに対してデータを共有することが出来ます。

https://docs.snowflake.com/ja/user-guide/data-sharing-reader-config

https://docs.snowflake.com/ja/user-guide/data-sharing-reader-create

DevelopersIOでもすでにこちらのブログはあるのですが、SnowflakeのUIがSnowsightに変更になっていることもあるため、改めて挙動を確認してみます。

事前準備

まず、リーダーアカウントに共有するためのデータベース・スキーマ・テーブルを用意しておきます。

今回は事前に下図のようなデータベース・スキーマ・テーブルを作成しておきました。

2024-10-21_07h03_56

SHAREオブジェクトを作成し、リーダーアカウントに共有するデータの権限を付与

リーダーアカウントに対してデータを共有するには、SHAREオブジェクトを作成し、そのSHAREオブジェクトに対して権限を付与する必要があります。

今回は下記のクエリを実行しました。

-- accountadminで行う
use role accountadmin;

-- shareの作成
create share sagara_share_test;

-- shareに閲覧権限を付与
grant usage on database sagara_rawdata_db to share sagara_share_test;
grant usage on schema sagara_rawdata_db.citibike to share sagara_share_test;
grant select on all tables in schema sagara_rawdata_db.citibike to share sagara_share_test;

リーダーアカウントの作成し、SHAREの権限を付与

次にリーダーアカウントの作成をします。下記のクエリを実行します。

use role accountadmin;

create managed account sagara_reader_account
    admin_name = sagara_reader.
    admin_password = '任意のパスワード',
    type = reader;

このクエリを実行すると、下図のようにアカウント名やログイン用のURLが表示されますのでメモしておきます。

2024-10-21_07h15_16

次に、下記のクエリを実行して先ほど作成したshareをこのリーダーアカウントが利用できるようにします。add accounts =の後には、先程作成したリーダーアカウントの情報の内、accountLocatorを指定することにご注意ください。

-- shareにアカウントを追加
alter share sagara_share_test add accounts = リーダーアカウントのaccountLocator;

この後下記のクエリを実行して、kindOUTBOUNDのレコードが確認できればOKです。

-- 適切に権限付与できたか確認
show shares;

2024-10-21_07h26_24

リーダーアカウントにログインし、SHAREからデータベースを作成

先ほどリーダーアカウント作成時に確認したURLを用いて、リーダーアカウントにログインしてみます。

ログインすると、通常のSnowsightと同じような画面となっています。

2024-10-21_08h34_35

次にワークシートを作成し、下記のクエリを実行してshareからデータベースを作成します。このときの注意点として、shareを指定する際はshow sharesコマンドで確認できるowner_account.nameの形にします

2024-10-21_08h47_25

-- accountadminで行う
use role accountadmin;

-- owner_accountとnameを確認
show shares;

-- shareからデータベース作成
create database sagara_share_db from share owner_accountの値.nameの値;

この後、下図のようにACCOUNTADMINロールから見てデータベースが作成されていればOKです。

2024-10-21_08h52_27

リーダーアカウント内で別のユーザーに閲覧権限を付与

これまでの工程でリーダーアカウント内でshareからデータベースを作成できましたが、このままでは別のユーザーの方がクエリを実行できないため、そのための準備を行います。

通常のSnowflakeと同じような形で、ウェアハウス・ロール・ユーザーを作成していきます。

-- リーダーアカウントでクエリを実行するロール「vistor_role」を作成
use role securityadmin;
create role visitor_role;
grant role visitor_role to role sysadmin;

-- 「vistor_role」がshareから作られたデータベースにクエリを実行できるように
use role accountadmin;
grant imported privileges on database sagara_share_db to role visitor_role;

-- ウェアハウスの作成
use role sysadmin;
create or replace warehouse visitor_wh with
    warehouse_size = 'XSMALL'
    warehouse_type = 'STANDARD'
    auto_suspend = 60
    auto_resume = true
    min_cluster_count = 1
    max_cluster_count = 1
    scaling_policy = 'STANDARD'
    initially_suspended = TRUE;
grant usage on warehouse visitor_wh to role visitor_role;

-- ユーザー作成
use role securityadmin;
create user sagara_visitor password ='任意のパスワード' email='任意のメールアドレス' default_role = visitor_role must_change_password = TRUE;
grant role visitor_role to user sagara_visitor;

-------------
-- オプション:リーダーアカウント内でshareされたデータから自由にテーブルを作ることができるようにオブジェクト作成と権限付与
-------------

-- visitorの人が自由にテーブルを作成できるデータベース・スキーマを作成
use role sysadmin;
create database visitor_db;
grant usage on database visitor_db to role visitor_role;

use database visitor_db;
create schema visitor_schema;
grant usage, create table, create view on schema visitor_schema to role visitor_role;

作成したユーザーで動作確認

先ほど作成したリーダーアカウント内でクエリするためのユーザーでログインして、shareされたデータに対してクエリを発行してみます。

まず、シンプルにshareから作られたデータベース内のテーブルに対してクエリを発行してみます。

use role visitor_role;
use database sagara_share_db;
use schema citibike;
use warehouse visitor_wh;

select * from weather;

2024-10-21_09h28_56

次に、オプションで作成したvisitor_dbvisitor_schema内に、新しいviewを作成してみます。権限を付与すれば、リーダーアカウントでもshareされたデータから自由にデータマート的なテーブル・ビューを作ることができます

create view visitor_db.visitor_schema.weather_view as
    select * from sagara_share_db.citibike.weather limit 10;

select * from visitor_db.visitor_schema.weather_view;

2024-10-21_09h32_38

注意事項:リーダーアカウント内では新しいデータのアップロードや既存のデータの変更などができません

ドキュメントにもある通り、リーダーアカウント内では下記のコマンドが実行できません。この仕様だけご注意ください。

  • INSERT
  • UPDATE
  • DELETE
  • MERGE
  • COPY INTO <テーブル>
  • CREATE MASKING POLICY
  • CREATE PIPE
  • CREATE ROW ACCESS POLICY
  • CREATE SHARE
  • CREATE STAGE
  • SHOW PROCEDURES

最後に

Snowflakeでリーダーアカウントを作成して挙動を確かめてみました。

リーダーアカウントでは新しいデータの追加などは出来ないのですが、shareされたデータを元にデータマート的なテーブル・ビューを作ることが出来てダウンロードも行えるので、「外部へのデータの閲覧・ダウンロード機能の提供」が目的であればリーダーアカウントはとても便利だと思います!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.